package luanluan.utils.load 
{
	import flash.utils.Dictionary;
	/**
	 * 加载列队
	 * @author luanluan
	 */
	public class LLoadQueue 
	{
		//*********************************************************//
		//	*列队
		private var _queue:Vector.<ILoader>;
		//	*loader字典,以url为键值
		private var _loaderDic:Dictionary;
		//	*储存加载完成的对象
		private var _completeDic:Dictionary;
		
		//*********************************************************//
		//	*当前已加载字节数
		private var _bytesLoaded:int;
		//	*总字节数
		private var _bytesTotal:int;
		//	*当前加载对象
		private var _loader:ILoader;
		
		//*********************************************************//
		//	*加载完毕处理函数
		private var _finishFunc:Function;
		//	*加载过程处理函数
		private var _progressFunc:Function;
		
		/**
		 * 创建一个加载列队
		 */
		public function LLoadQueue() 
		{
			_queue 			= new Vector.<ILoader>();
			_loaderDic 		= new Dictionary();
			_completeDic 	= new Dictionary();
		}
		
		/**
		 * 添加loader到列队
		 * @param	loader
		 */
		public function addLoader(loader:ILoader):void
		{
			if (_queue.indexOf(loader) == -1)
			{
				_queue.push(loader);
				_loaderDic[loader.url] = loader;
			}
		}
		
		//*********************************************************//
		//	* public functions
		
		/**
		 * 开始加载
		 */
		public function start():void
		{
			if (_queue.length)
			{
				_bytesLoaded 	= 0;
				_bytesTotal 	= 0;
				var len:int = _queue.length;
				for (var i:int = 0; i < len; i++) 
				{
					_loader 	= _queue[i];
					_bytesTotal += _loader.bytesTotal;
				}
				next();
			}
		}
		
		/**
		 * 设置加载完成处理函数
		 * @param	func
		 */
		public function setFinish(func:Function):void
		{
			_finishFunc = func;
		}
		
		/**
		 * 设置加载进度处理函数
		 * @param	func
		 */
		public function setProgress(func:Function):void
		{
			_progressFunc = func;
		}
		
		/**
		 * 已加载字节数
		 */
		public function get bytesLoaded():int 
		{
			return _bytesLoaded;
		}
		
		/**
		 * 总字节数
		 */
		public function get bytesTotal():int 
		{
			return _bytesTotal;
		}
		
		/**
		 * 已加载百分比
		 */
		public function get percent():Number
		{
			return 100 * _bytesLoaded / _bytesTotal;
		}
		
		/**
		 * 根据url获取loader
		 * @param	url
		 * @return
		 */
		public function getLoader(url:String):ILoader
		{
			return _loaderDic[url];
		}
		
		//*********************************************************//
		//	* private functions
		
		//	*开始下一个加载
		private function next():void
		{
			_loader = _queue.shift();
			if (_progressFunc != null)
				_loader.setProgress(progressHandle);
			_loader.setComplete(completeHandle);
			_loader.start();
		}
		
		//	*加载处理
		private function progressHandle():void
		{
			_bytesLoaded = _loader.bytesLoaded;
			_bytesTotal	 = _loader.bytesTotal;
			if (_progressFunc != null)
				_progressFunc();
		}
		
		//	*加载完成一个
		private function completeHandle():void
		{
			if (!_queue.length)
				_finishFunc();
			else
				next();
		}
		
	}

}